#!/usr/local/bin/pike
which will cause all subsequent occurances of 'identifier' to be replaced with the replacement string.
Define also has the capability to use arguments, thus a line like
would cause identifer to be a macro. All occurances of 'identifier(something1,something2d)' would be replaced with the replacement string. And in the replacement string, arg1 and arg2 will be replaced with something1 and something2.
#define foo bar // a comment
The comment will be included in the define, and thus inserted in the code. This will have the effect that the rest of the line will be ignored when the word foo is used. Not exactly what you might expect.
Expressions given to #if, #elif or #endif are special, all identifiers evaluate to zero unless they are defined to something else. Integers, strings and floats are the only types that can be used, but all pike operators can be used on these types.
Also, two special functions can be used, defined() and constant(). defined(<identifer>) expands to '1' if the identifier is defined, '0' otherwise. constant(<identifier>) expands to '1' if identifer is an predefined constant (with add_constant), '0' otherwise.
#if defined(FOO)
#if !constant(write_file)
inherit "simulate.pike"
#endif
This can also be used when generating pike from something else, to tell teh compiler where the code originally originated from.